package cn.tedu.fresheveryday.service.impl;

import cn.tedu.fresheveryday.exception.ServiceException;
import cn.tedu.fresheveryday.mapper.ProductMapper;
import cn.tedu.fresheveryday.mapper.ShopCartMapper;
import cn.tedu.fresheveryday.pojo.entity.Product;
import cn.tedu.fresheveryday.pojo.entity.ShopCart;
import cn.tedu.fresheveryday.pojo.vo.ShopCartSimpleVO;
import cn.tedu.fresheveryday.pojo.vo.ShopCartVO;
import cn.tedu.fresheveryday.restful.ResponseCode;
import cn.tedu.fresheveryday.service.IShopCartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;

@Service
public class ShopCartServiceImpl implements IShopCartService {
    @Autowired
    private ShopCartMapper mapper;

    @Autowired
    private ProductMapper productMapper;

    @Override
    public void insert(ShopCart shopCart) {
        // 获取商品id
        int productId = shopCart.getProductId();

        // 判断商品剩余库存是否充足
        Product product = productMapper.selectById(productId);

        // 商品库存小于购物车商品数量，返回库存不足提示信息
        if (product.getQuantity() < shopCart.getQuantity()) {
            throw new ServiceException(ResponseCode.BAD_REQUEST, "添加购物车失败，商品库存不足！");
        }

        // 通过商品id查询商品库存
        int quantity = productMapper.selectQuantityById(productId);
        Double price = product.getPrice();

        // 以下两种情况为list.html页面点击购物车图标，添加单个购物车业务
        // 如果购物车商品数量为null，设为1
        if (shopCart.getQuantity() == null) {
            shopCart.setQuantity(1);
        }
        // 如果购物车金额为null，设置为商品的单价
        if (shopCart.getMoney() == null) {
            shopCart.setMoney(price);
        }

        // 得到购物车商品数量
        int shopCartProductQuantity = shopCart.getQuantity();

        // 商品数库存减少：新商品库存 = 商品库存 - 购物车商品数量
        productMapper.updateQuantityById(productId, quantity - shopCartProductQuantity);

        // 根据用户id和商品id查询购物车
        ShopCartSimpleVO shopCartSimpleVO = mapper.selectByUserIdAndProductId(
                shopCart.getUserId(), // 用户id
                productId // 商品id
        );

        // 如果购物车已存在，修改购物车中商品的数量
        if (shopCartSimpleVO != null) {
            int newQuantity =  shopCartSimpleVO.getQuantity() + shopCartProductQuantity;

            mapper.updateQuantityById(
                    shopCartSimpleVO.getId(), // 购物车id
                    newQuantity // 新的购物车商品数量
            );

            mapper.updateMoneyById(
                    shopCartSimpleVO.getId(), // 购物车id
                    (price * 100) * newQuantity / 100 // 新的购物车金额
            );
        } else {
            // 计算购物车金额：商品价格 × 购物车商品数量
            double money = ((price * 100) * shopCartProductQuantity)  / 100;

            // 设置购物车id
            shopCart.setId(UUID.randomUUID().toString());
            // 设置购物车创建时间
            shopCart.setCreated(LocalDateTime.now());
            // 设置购物车金额
            shopCart.setMoney(money);

            // 购物车不存在，添加购物车
            mapper.insert(shopCart);
        }
    }

    @Override
    public void deleteById(String id) {
        // 通过id查询购物车信息
        ShopCartVO shopCartVO = mapper.selectById(id);

        // 如果购物车不存在，抛出异常
        if (shopCartVO == null) {
            throw new ServiceException(ResponseCode.NOT_FOUND, "购物车不存在，删除失败");
        }

        // 得到购物车的商品id
        int productId = shopCartVO.getProductId();
        // 通过商品id查询商品库存
        int quantity = productMapper.selectQuantityById(productId);

        // 1、恢复商品库存
        productMapper.updateQuantityById(productId, quantity + shopCartVO.getQuantity());
        // 2、通过id删除购物车
        mapper.deleteById(id);
    }

    @Override
    public ShopCartVO selectById(String id) {
        return mapper.selectById(id);
    }

    @Override
    public int selectCount(String userId) {
        return mapper.selectCount(userId);
    }

    @Override
    public List<ShopCartVO> selectByUserId(String userId) {
        return mapper.selectByUserId(userId);
    }

}